﻿using Autofac;
using Autofac.Integration.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Compilation;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace MVC
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            #region autofac依赖注入容器
            // 创建一个容器
            var builder = new ContainerBuilder();
            // 注册所有的Controller
            builder.RegisterControllers(Assembly.GetExecutingAssembly());
            // RegisterType方式：
            builder.RegisterType<InjectionTestService>().AsSelf().InstancePerDependency();
            // Register方式：
            builder.Register(c => new InjectionTestService()).AsSelf().InstancePerDependency();

            // 自动注入的方式，不需要知道具体类的名称

            /* BuildManager.GetReferencedAssemblies()
             * 程序集的集合，包含 Web.config 文件的 assemblies 元素中指定的程序集、
             * 从 App_Code 目录中的自定义代码生成的程序集以及其他顶级文件夹中的程序集。
             */

            // 获取包含继承了IService接口类的程序集
            var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>()
                .Where(
                    assembly =>
                        assembly.GetTypes().FirstOrDefault(type => type.GetInterfaces().Contains(typeof(IService))) !=
                        null
                );

            // RegisterAssemblyTypes 注册程序集
            var enumerable = assemblies as Assembly[] ?? assemblies.ToArray();
            if (enumerable.Any())
            {
                builder.RegisterAssemblyTypes(enumerable)
                    .Where(type => type.GetInterfaces().Contains(typeof(IService))).AsSelf().InstancePerDependency();
            }

            // 把容器装入到微软默认的依赖注入容器中
            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

            #endregion


        }
    }
}
